package cn.dianchiyun.protocol.netty.dtu.handler.impl;

import cn.dianchiyun.protocol.netty.dtu.entity.DTURead;
import cn.dianchiyun.protocol.netty.utils.HexUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class TestDecoderHandler extends ByteToMessageDecoder {
    //数据包基础长度
    private final int BASE_LENGTH = 4;

    //设备注册码的长度
    private final int SERIAL_CODE_LENGTH = 12;

    private final byte HEAD_DATA = 0x7E;

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {
        try {
            //基础长度不足，我们设定基础长度为4
            if (in.readableBytes() < BASE_LENGTH) {
                return;
            }
            /*int beginIdx; //记录包头位置
            while (true) {
                // 防止socket字节流攻击
                // 防止，客户端传来的数据过大
                // 因为，太大的数据，是不合理的
                if (in.readableBytes() > 2048) {
                    in.skipBytes(in.readableBytes());
                }
                // 获取包头开始的index
                beginIdx = in.readerIndex();
                // 标记包头开始的index
                in.markReaderIndex();
                // 读到了协议的开始标志，结束while循环
                if (in.readByte() == HEAD_DATA) {
                    break;
                }
                // 未读到包头，略过一个字节
                // 每次略过，一个字节，去读取，包头信息的开始标记
                in.resetReaderIndex();
                // 当略过，一个字节之后，
                // 数据包的长度，又变得不满足
                // 此时，应该结束。等待后面的数据到达
                if (in.readableBytes() < BASE_LENGTH) {
                    return;
                }
            }*/

            //如果是已读完了，那么说明这个包是心跳包,并且后面没有粘包
            int readableCount = in.readableBytes();
            if (readableCount <= 12) {
                DTURead dtuRead = new DTURead("0000000000001", true);
                out.add(dtuRead);
            } else {
                byte[] bytes = new byte[in.readableBytes()];
                in.readBytes(bytes);//复制内容到字节数组bytes
                String receiveStr = HexUtil.receiveHexToString(bytes);//将接收到的数据转为字符串，此字符串就是客户端发送的字符串

                System.out.println(receiveStr);

                DTURead dtuRead = new DTURead("0000000000001", false, "01", "01", 10, new byte[10], new Integer[10], 1);
                out.add(dtuRead);
            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

}